#include <head.h>
// 无名管道
/*
位置 内核
通讯方式 管道的通讯方式
限制 只能有亲缘关系的情况下才能通讯

`pipefd[0]` 是管道的读端
`pipefd[1]` 是管道的写端
*/
int main(int argc, char const *argv[])
{
    // 声明管道的文件描述符
    int pipe_1[2];

    // 声明一个缓冲区
    char buf[1024];

    // 声明进程的 pid
    pid_t pid;

    // 创建管道文件
    if (-1 == pipe(pipe_1))
    {
        ERRLOG("管道创建失败");
        return 0;
    }

    // 创建进程
    if (-1 == (pid = fork()))
    {
        ERRLOG("进程创建失败");
        return 0;
    }
    else if (pid == 0) // 子进程
    {
        // 清空缓冲区
        memset( buf , 0 , sizeof(buf) );
        // 关闭写端
        close(pipe_1[1]);
        while (1)
        {
            // 等待接收
            read( pipe_1[0] , buf , sizeof(buf) );

            // 打印数据
            printf("接收到了:%s\n" , buf);

            // 如果用户的写入的是退出
            if (!strcmp(buf, "quie"))
            {
                // 关闭文件
                close(pipe_1[0]);
                // 结束进程
                exit(1);
            }

            // 清空缓冲区
            memset( buf , 0 , sizeof(buf) );
        }
    }
    else if (pid > 0) // 父进程
    {
        // 关闭读端
        close(pipe_1[0]);
        while (1)
        {
            // 等待用户输入
            printf("请输入信息:");
            scanf("%s", buf);

            // 增加尾0
            buf[strlen(buf)] = '\0';

            // 如果用户的写入的是退出
            if (!strcmp(buf, "quie"))
            {
                // 写入到文件中
                write(pipe_1[1], buf, strlen(buf));
                // 关闭文件
                close(pipe_1[1]);

                // 回收子进程
                wait(NULL);
                // 结束进程
                exit(1);
            }
            // 写入到文件中
            write(pipe_1[1], buf, strlen(buf));

            // 清空缓冲区
            memset( buf , 0 , sizeof(buf) );
        }
    }

    return 0;
}